<?php

namespace App\Http\Responses;

class AjaxResult
{
    const CODE_TAG = 'code';
    const MSG_TAG = 'msg';
    const DATA_TAG = 'data';
    const HTTP_SUCCESS = 200;
    const HTTP_WARN = 300;
    const HTTP_ERROR = 500;

    private $attributes = [];

    /**
     * 初始化一个新创建的 AjaxResult 对象
     *
     * @param int $code 状态码
     * @param string $msg 返回内容
     * @param mixed $data 数据对象
     */
    public function __construct(int $code, string $msg, $data = null)
    {
        $this->attributes[self::CODE_TAG] = $code;
        $this->attributes[self::MSG_TAG] = $msg;
        if (!is_null($data)) {
            $this->attributes[self::DATA_TAG] = $data;
        }
    }

    /**
     * 返回成功消息
     *
     * @param string $msg 返回内容
     * @param mixed $data 数据对象
     * @return $this
     */
    public static function success(string $msg = '操作成功', $data = null): self
    {
        return new self(self::HTTP_SUCCESS, $msg, $data);
    }

    /**
     * 返回警告消息
     *
     * @param string $msg 返回内容
     * @param mixed $data 数据对象
     * @return $this
     */
    public static function warn(string $msg = '警告', $data = null): self
    {
        return new self(self::HTTP_WARN, $msg, $data);
    }

    /**
     * 返回错误消息
     *
     * @param string $msg 返回内容
     * @param mixed $data 数据对象
     * @return $this
     */
    public static function error(string $msg = '操作失败', $data = null): self
    {
        return new self(self::HTTP_ERROR, $msg, $data);
    }

    /**
     * 添加响应数据
     *
     * @param string $key 键名
     * @param mixed $value 键值
     * @return $this
     */
    public function put(string $key, $value): self
    {
        $this->attributes[$key] = $value;
        return $this;
    }

    /**
     * 是否为成功消息
     *
     * @return bool
     */
    public function isSuccess(): bool
    {
        return $this->attributes[self::CODE_TAG] === self::HTTP_SUCCESS;
    }

    /**
     * 是否为警告消息
     *
     * @return bool
     */
    public function isWarn(): bool
    {
        return $this->attributes[self::CODE_TAG] === self::HTTP_WARN;
    }

    /**
     * 是否为错误消息
     *
     * @return bool
     */
    public function isError(): bool
    {
        return $this->attributes[self::CODE_TAG] === self::HTTP_ERROR;
    }

    /**
     * 转换为响应对象
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function toResponse()
    {
        return response()->json($this->attributes);
    }
}